CryptoPro JTLS.
Public API.

ru.CryptoPro.ssl.java6
Class SSLEngineImpl

java.lang.Object
  extended by javax.net.ssl.SSLEngine
      extended by ru.CryptoPro.ssl.java6.SSLEngineImpl

public final class SSLEngineImpl
extends javax.net.ssl.SSLEngine

Реализация механизма обмена без блокировок SSLEngine.

*В настоящий момент*, SSLEngine существует одновременно с классом SSLSocket. Таким образом, текущая реализация содержит много схожих абстракций. Это выражается во многих областях, наиболее ярко в операциях обработки ввода/вывода (IO handling).

Существуют три основных I/O потока (операции), которые могут выполняться параллельно: wrap(), unwrap(), and beginHandshake(). Мы рекомендуем пользоватеям не создавать множество wrap или unwrap, потому что данные, как может оказаться, поступают непоследовательно. В классе предпринята попытка как минимум сохранять порядок следования данных, однако он все же может нарушиться. Например, thread1 и thread2 оба вызывают wrap, thread1 получает первый пакет, thread2 получает второй пакет, но thread2 вернул контроль раньше thread1 и отправил данные. Принимающая сторона получит ошибку о нарушении порядка следования.

"Рукопожатие" осуществляется аналогично SSLSocket с использованием класов- потомков InputStream/OutputStream. Созданные классы ClientHandshakers/ServerHandshakers, создают и обрабатывают данные для обмена. Эти данные формируются преимущественно классами HandshakeInStream/HandshakeOutStreams. Наконец, классы типа InputRecord/OutputRecords, выполняют чтение/запись в сокет; их отличительная особенность в том, что их функционал расширен классами EngineInputRecord/EngineOutputRecord, которые и определяют специфику SSLEngine.

Основные отличия:

EngineInputRecord/EngineOutputRecord/EngineWriter:


Field Summary
 ru.CryptoPro.ssl.java6.EngineInputRecord inputRecord
           
 ru.CryptoPro.ssl.java6.EngineOutputRecord outputRecord
           
 
Constructor Summary
SSLEngineImpl(SSLContextImpl ctx)
          Конструктор для SSLEngine из SSLContext, без указания хоста и порта.
SSLEngineImpl(SSLContextImpl ctx, java.lang.String host, int port)
          Конструктор для SSLEngine из SSLContext.
 
Method Summary
 void beginHandshake()
           
 void closeInbound()
           
 void closeOutbound()
          Закрытие исходящего потока сообщений.
 java.lang.Runnable getDelegatedTask()
          Получение текущей Runnable задачи для данного SSLEngine.
 java.lang.String[] getEnabledCipherSuites()
          Функция возвращает имена SSL CipherSuite, которые на данный момент доступны для использования в данном соединении.
 java.lang.String[] getEnabledProtocols()
          Функция возвращает имена протоколов, которые на данный момент доступны для использования в данном соединении.
 boolean getEnableSessionCreation()
          Функция возвращает true, если новые соединения могут создавать новые SSL сессии.
 javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus()
           
 java.lang.String getHostnameVerification()
          Получение алгоритма идентификации хоста для engine.
 boolean getNeedClientAuth()
          Функция возвращает true, если аутентификация клиента требуется.
 javax.net.ssl.SSLSession getSession()
          Функция возращает SSL сессию для использования в данном соединении.
 java.lang.String[] getSupportedCipherSuites()
          Функция возвращает имена CipherSuite, которые могут быть использованы в данном SSL соединении.
 java.lang.String[] getSupportedProtocols()
          Функция возвращает протоколы, поддерживаемые данной реализацией.
 boolean getUseClientMode()
          Функция возвращает true, если сокет работает в режиме клиента.
 boolean getWantClientAuth()
          Функция возвращает true, если аутентификация клиента желательна.
 boolean isInboundDone()
          Проверка, закрыт ли входящий поток данных приложения.
 boolean isOutboundDone()
          Проверка, закрыт ли исходящий поток данных приложения.
 void setEnabledCipherSuites(java.lang.String[] suites)
          Функция контролирует то, какие конкретно CipherSuite доступны для использования в данном соединении.
 void setEnabledProtocols(java.lang.String[] protocols)
          Функция контролирует, какие протоколы доступны для использования в данном соединении.
 void setEnableSessionCreation(boolean flag)
          Функция контролирует, могут ли новые соединения создавать новые SSL сессии.
 void setNeedClientAuth(boolean flag)
          Функция устанавливает флаг, контролирующий то, требует ли сокет в режиме сервера аутентификацию клиента.
 void setUseClientMode(boolean flag)
          Функция устанавливает флаг, контролирующий то, будет ли данный сокет работать в режиме SSL клиента или в режиме сервера.
 void setVersion(ru.CryptoPro.ssl.ProtocolVersion protocolVersion)
          Функция устанавливает версию протокола, ассоциированную с данным соединенем.
 void setWantClientAuth(boolean flag)
          Функция устанавливает флаг, контролирующий то, желает ли сокет в режиме сервера аутентификацию клиента.
 java.lang.String toString()
          Функция возвращает печатное представление данной стороны соединения.
 boolean trySetHostnameVerification(java.lang.String identificationAlgorithm)
          Конфигугрирование алгоритма идентификации конечного хоста engine.
 javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer netData, java.nio.ByteBuffer[] appData, int offset, int length)
          Расшифровывает буфер.
 javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer[] appData, int offset, int length, java.nio.ByteBuffer netData)
          Расшифровывает буфер.
 void writeRecord(ru.CryptoPro.ssl.java6.EngineOutputRecord eor)
           
 
Methods inherited from class javax.net.ssl.SSLEngine
getPeerHost, getPeerPort, getSSLParameters, setSSLParameters, unwrap, unwrap, wrap, wrap
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

inputRecord

public ru.CryptoPro.ssl.java6.EngineInputRecord inputRecord

outputRecord

public ru.CryptoPro.ssl.java6.EngineOutputRecord outputRecord
Constructor Detail

SSLEngineImpl

public SSLEngineImpl(SSLContextImpl ctx)
Конструктор для SSLEngine из SSLContext, без указания хоста и порта. В этом случае кэшировние сессий не выполняется, возобновление сессий выполняется вручную.


SSLEngineImpl

public SSLEngineImpl(SSLContextImpl ctx,
                     java.lang.String host,
                     int port)
Конструктор для SSLEngine из SSLContext.

Method Detail

getHandshakeStatus

public javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus()
Specified by:
getHandshakeStatus in class javax.net.ssl.SSLEngine

setVersion

public void setVersion(ru.CryptoPro.ssl.ProtocolVersion protocolVersion)
Функция устанавливает версию протокола, ассоциированную с данным соединенем. Вызывается один раз из объекта Handshaker, после того, как о стороны договорились о версии протокола.


beginHandshake

public void beginHandshake()
                    throws javax.net.ssl.SSLException
Specified by:
beginHandshake in class javax.net.ssl.SSLEngine
Throws:
javax.net.ssl.SSLException

unwrap

public javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer netData,
                                            java.nio.ByteBuffer[] appData,
                                            int offset,
                                            int length)
                                     throws javax.net.ssl.SSLException
Расшифровывает буфер. Выполняются различные проверки перед блокировкой потока.

Specified by:
unwrap in class javax.net.ssl.SSLEngine
Throws:
javax.net.ssl.SSLException

wrap

public javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer[] appData,
                                          int offset,
                                          int length,
                                          java.nio.ByteBuffer netData)
                                   throws javax.net.ssl.SSLException
Расшифровывает буфер. Выполняются различные проверки перед блокировкой потока.

Specified by:
wrap in class javax.net.ssl.SSLEngine
Throws:
javax.net.ssl.SSLException

writeRecord

public void writeRecord(ru.CryptoPro.ssl.java6.EngineOutputRecord eor)
                 throws java.io.IOException
Throws:
java.io.IOException

closeOutbound

public void closeOutbound()
Закрытие исходящего потока сообщений.

Specified by:
closeOutbound in class javax.net.ssl.SSLEngine

isOutboundDone

public boolean isOutboundDone()
Проверка, закрыт ли исходящий поток данных приложения.

Specified by:
isOutboundDone in class javax.net.ssl.SSLEngine

closeInbound

public void closeInbound()
                  throws javax.net.ssl.SSLException
Specified by:
closeInbound in class javax.net.ssl.SSLEngine
Throws:
javax.net.ssl.SSLException

isInboundDone

public boolean isInboundDone()
Проверка, закрыт ли входящий поток данных приложения.

Specified by:
isInboundDone in class javax.net.ssl.SSLEngine

getSession

public javax.net.ssl.SSLSession getSession()
Функция возращает SSL сессию для использования в данном соединении. Она может долго существовать и часто соответствует сессии какого-либо пользователя.

Specified by:
getSession in class javax.net.ssl.SSLEngine

getDelegatedTask

public java.lang.Runnable getDelegatedTask()
Получение текущей Runnable задачи для данного SSLEngine.

Specified by:
getDelegatedTask in class javax.net.ssl.SSLEngine

setEnableSessionCreation

public void setEnableSessionCreation(boolean flag)
Функция контролирует, могут ли новые соединения создавать новые SSL сессии.

До тех пор, пока обмен не начался, возможно изменить возможность создания сессий. В противном случае, придется ждать следующего обмена.

Specified by:
setEnableSessionCreation in class javax.net.ssl.SSLEngine

getEnableSessionCreation

public boolean getEnableSessionCreation()
Функция возвращает true, если новые соединения могут создавать новые SSL сессии.

Specified by:
getEnableSessionCreation in class javax.net.ssl.SSLEngine

setNeedClientAuth

public void setNeedClientAuth(boolean flag)
Функция устанавливает флаг, контролирующий то, требует ли сокет в режиме сервера аутентификацию клиента.

До тех пор, пока обмен не начался, возможно изменить, требуется ли аутентификация клиента. В противном случае, придется ждать следующего обмена.

Specified by:
setNeedClientAuth in class javax.net.ssl.SSLEngine

getNeedClientAuth

public boolean getNeedClientAuth()
Функция возвращает true, если аутентификация клиента требуется.

Specified by:
getNeedClientAuth in class javax.net.ssl.SSLEngine

setWantClientAuth

public void setWantClientAuth(boolean flag)
Функция устанавливает флаг, контролирующий то, желает ли сокет в режиме сервера аутентификацию клиента.

До тех пор, пока обмен не начался, возможно изменить, желательна ли аутентификация клиента. В противном случае, придется ждать следующего обмена.

Specified by:
setWantClientAuth in class javax.net.ssl.SSLEngine

getWantClientAuth

public boolean getWantClientAuth()
Функция возвращает true, если аутентификация клиента желательна.

Specified by:
getWantClientAuth in class javax.net.ssl.SSLEngine

setUseClientMode

public void setUseClientMode(boolean flag)
Функция устанавливает флаг, контролирующий то, будет ли данный сокет работать в режиме SSL клиента или в режиме сервера. Должна вызываться до того, как началась пересылка SSL данных.

Specified by:
setUseClientMode in class javax.net.ssl.SSLEngine

getUseClientMode

public boolean getUseClientMode()
Функция возвращает true, если сокет работает в режиме клиента.

Specified by:
getUseClientMode in class javax.net.ssl.SSLEngine

getSupportedCipherSuites

public java.lang.String[] getSupportedCipherSuites()
Функция возвращает имена CipherSuite, которые могут быть использованы в данном SSL соединении. Обычно, только их подмножество будет дейтсвительно доступно по умолчанию, поскольку этот список может включать CipherSuite, которые не поддерживают двустороннюю аутентификацию сервера и клиента, или которые не обеспечивают конфиденциальность данных. Серверы также могут нуждаться в конкретном виде сертификатов для использования конкретных CipherSuite.

Specified by:
getSupportedCipherSuites in class javax.net.ssl.SSLEngine
Returns:
список имен CipherSuite

setEnabledCipherSuites

public void setEnabledCipherSuites(java.lang.String[] suites)
Функция контролирует то, какие конкретно CipherSuite доступны для использования в данном соединении. Такие CipherSuite должны быть предварительно перечислены функцией getCipherSuites() как используемые. Даже если CipherSuite был доступен, он может никогда не использоваться, если противоположная сторона его не поддерживает, либо требуемые сертификаты (и закрытые ключи) не доступны.

Specified by:
setEnabledCipherSuites in class javax.net.ssl.SSLEngine
Parameters:
suites - список доступных CipherSuite.

getEnabledCipherSuites

public java.lang.String[] getEnabledCipherSuites()
Функция возвращает имена SSL CipherSuite, которые на данный момент доступны для использования в данном соединении. Когда SSL сокет впервые создан, все доступные CipherSuite (a) обеспечивают конфиденциальность данных путем зашифрования траффика и (b) позволяют осуществлять двустороннюю аутентификацию сервера и клиента. Поэтому, в некоторых окружениях, это значение может быть пустым.

Specified by:
getEnabledCipherSuites in class javax.net.ssl.SSLEngine
Returns:
список имен CipherSuite

getSupportedProtocols

public java.lang.String[] getSupportedProtocols()
Функция возвращает протоколы, поддерживаемые данной реализацией. Подмножество этих протоколов может быть доступно для данного соединения.

Specified by:
getSupportedProtocols in class javax.net.ssl.SSLEngine
Returns:
список имен протоколов.

setEnabledProtocols

public void setEnabledProtocols(java.lang.String[] protocols)
Функция контролирует, какие протоколы доступны для использования в данном соединении. Протоколы должны быть предварительно перечислены функцией getSupportedProtocols() как поддерживаемые.

Specified by:
setEnabledProtocols in class javax.net.ssl.SSLEngine
Parameters:
protocols - список доступных протоколов.
Throws:
java.lang.IllegalArgumentException - когда какое-то из передаваемых имен протоколов не поддерживается.

getEnabledProtocols

public java.lang.String[] getEnabledProtocols()
Функция возвращает имена протоколов, которые на данный момент доступны для использования в данном соединении.

Specified by:
getEnabledProtocols in class javax.net.ssl.SSLEngine
Returns:
имена доступных протоколов

trySetHostnameVerification

public boolean trySetHostnameVerification(java.lang.String identificationAlgorithm)
Конфигугрирование алгоритма идентификации конечного хоста engine.

Parameters:
identificationAlgorithm - Алгоритм для проверки целостности.
Returns:
true, если настройка выполнена успешно.

getHostnameVerification

public java.lang.String getHostnameVerification()
Получение алгоритма идентификации хоста для engine.


toString

public java.lang.String toString()
Функция возвращает печатное представление данной стороны соединения.

Overrides:
toString in class java.lang.Object

Copyright Crypto-Pro.
All rights reserved.